﻿using System;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;

namespace WinForms.Framework.Base
{
    /// <summary>
    /// UI 階層の基底クラスです。
    /// </summary>
    /// <remarks>abstract クラスにするとデザイナが正しく表示できなくなるので、このまま継承してください。</remarks>
    public partial class UIBase : Form
    {
        /// <summary>
        /// タブインデックスを自動で設定するかどうかを設定します。
        /// </summary>
        [Category("Framework")]
        [DefaultValue(true)]
        [Description("タブインデックスを自動で設定するかどうかを設定します。")]
        public bool AutoTabIndex { get; set; }

        /// <summary>
        /// UIBase クラスの新しいインスタンスを初期化します。
        /// </summary>
        protected UIBase()
        {
            AutoTabIndex = true;

            InitializeComponent();
        }

        /// <summary>
        /// フォームが初めて表示される直前に発生します。
        /// </summary>
        protected override void OnLoad(EventArgs e)
        {
            if (AutoTabIndex)
                SetTabIndex(Controls);

            base.OnLoad(e);
        }

        /// <summary>
        /// コントロールにタブインデックスを設定します。
        /// </summary>
        private void SetTabIndex(Control.ControlCollection controls)
        {
            var controlList = controls.Cast<Control>().ToList();
            var sortedControls = controlList.OrderBy(r => r.Location.Y).ThenBy(r => r.Location.X);

            int tabIndex = 0;
            foreach (Control control in sortedControls)
            {
                if (control.HasChildren)
                    SetTabIndex(control.Controls);

                control.TabIndex = tabIndex;
                tabIndex++;
            }
        }
    }
}
